<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en-US">
<head>
<!-- GenHTML revision 25226-->
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Using Alternatives - The Java EE 6 Tutorial</title>
<meta name="robots" content="index,follow">
<meta name="robots" content="index,follow">
<meta name="date" content="2011-03-01">
<link rel="stylesheet" type="text/css" href="css/default.css">
<link rel="stylesheet" type="text/css" href="css/ipg.css">
<link rel="stylesheet" type="text/css" href="css/javaeetutorial.css">
</head>

<body>

<table border="0" cellpadding="5" cellspacing="0" width="100%">
<tbody>
   <tr valign="top">
      <td width="400px"><p class="toc level1"><a href="docinfo.html">Document Information</a></p>
<p class="toc level1 tocsp"><a href="gexaf.html">Preface</a></p>
<p class="toc level1 tocsp"><a href="gfirp.html">Part&nbsp;I&nbsp;Introduction</a></p>
<p class="toc level2"><a href="bnaaw.html">1.&nbsp;&nbsp;Overview</a></p>
<p class="toc level2"><a href="gfiud.html">2.&nbsp;&nbsp;Using the Tutorial Examples</a></p>
<p class="toc level1 tocsp"><a href="bnadp.html">Part&nbsp;II&nbsp;The Web Tier</a></p>
<p class="toc level2"><a href="bnadr.html">3.&nbsp;&nbsp;Getting Started with Web Applications</a></p>
<p class="toc level2"><a href="bnaph.html">4.&nbsp;&nbsp;JavaServer Faces Technology</a></p>
<p class="toc level2"><a href="giepx.html">5.&nbsp;&nbsp;Introduction to Facelets</a></p>
<p class="toc level2"><a href="gjddd.html">6.&nbsp;&nbsp;Expression Language</a></p>
<p class="toc level2"><a href="bnaqz.html">7.&nbsp;&nbsp;Using JavaServer Faces Technology in Web Pages</a></p>
<p class="toc level2"><a href="gjcut.html">8.&nbsp;&nbsp;Using Converters, Listeners, and Validators</a></p>
<p class="toc level2"><a href="bnatx.html">9.&nbsp;&nbsp;Developing with JavaServer Faces Technology</a></p>
<p class="toc level2"><a href="gkmaa.html">10.&nbsp;&nbsp;JavaServer Faces Technology Advanced Concepts</a></p>
<p class="toc level2"><a href="bnawo.html">11.&nbsp;&nbsp;Configuring JavaServer Faces Applications</a></p>
<p class="toc level2"><a href="gkiow.html">12.&nbsp;&nbsp;Using Ajax with JavaServer Faces Technology</a></p>
<p class="toc level2"><a href="gkhxa.html">13.&nbsp;&nbsp;Advanced Composite Components</a></p>
<p class="toc level2"><a href="bnavg.html">14.&nbsp;&nbsp;Creating Custom UI Components</a></p>
<p class="toc level2"><a href="bnafd.html">15.&nbsp;&nbsp;Java Servlet Technology</a></p>
<p class="toc level2"><a href="bnaxu.html">16.&nbsp;&nbsp;Internationalizing and Localizing Web Applications</a></p>
<p class="toc level1 tocsp"><a href="bnayk.html">Part&nbsp;III&nbsp;Web Services</a></p>
<p class="toc level2"><a href="gijti.html">17.&nbsp;&nbsp;Introduction to Web Services</a></p>
<p class="toc level2"><a href="bnayl.html">18.&nbsp;&nbsp;Building Web Services with JAX-WS</a></p>
<p class="toc level2"><a href="giepu.html">19.&nbsp;&nbsp;Building RESTful Web Services with JAX-RS</a></p>
<p class="toc level2"><a href="gjjxe.html">20.&nbsp;&nbsp;Advanced JAX-RS Features</a></p>
<p class="toc level2"><a href="gkojl.html">21.&nbsp;&nbsp;Running the Advanced JAX-RS Example Application</a></p>
<p class="toc level1 tocsp"><a href="bnblr.html">Part&nbsp;IV&nbsp;Enterprise Beans</a></p>
<p class="toc level2"><a href="gijsz.html">22.&nbsp;&nbsp;Enterprise Beans</a></p>
<p class="toc level2"><a href="gijre.html">23.&nbsp;&nbsp;Getting Started with Enterprise Beans</a></p>
<p class="toc level2"><a href="gijrb.html">24.&nbsp;&nbsp;Running the Enterprise Bean Examples</a></p>
<p class="toc level2"><a href="bnbpk.html">25.&nbsp;&nbsp;A Message-Driven Bean Example</a></p>
<p class="toc level2"><a href="gkcqz.html">26.&nbsp;&nbsp;Using the Embedded Enterprise Bean Container</a></p>
<p class="toc level2"><a href="gkidz.html">27.&nbsp;&nbsp;Using Asynchronous Method Invocation in Session Beans</a></p>
<p class="toc level1 tocsp"><a href="gjbnr.html">Part&nbsp;V&nbsp;Contexts and Dependency Injection for the Java EE Platform</a></p>
<p class="toc level2"><a href="giwhb.html">28.&nbsp;&nbsp;Introduction to Contexts and Dependency Injection for the Java EE Platform</a></p>
<p class="toc level2"><a href="gjbls.html">29.&nbsp;&nbsp;Running the Basic Contexts and Dependency Injection Examples</a></p>
<p class="toc level2"><a href="gjehi.html">30.&nbsp;&nbsp;Contexts and Dependency Injection for the Java EE Platform: Advanced Topics</a></p>
<div id="scrolltoc" class="onpage">
<p class="toc level3"><a href="">Using Alternatives</a></p>
<p class="toc level4"><a href="#gkhpo">Using Specialization</a></p>
</div>
<p class="toc level3 tocsp"><a href="gkgkv.html">Using Producer Methods and Fields</a></p>
<p class="toc level3"><a href="gkhic.html">Using Events</a></p>
<p class="toc level4"><a href="gkhic.html#gkhhy">Defining Events</a></p>
<p class="toc level4"><a href="gkhic.html#gkhnf">Using Observer Methods to Handle Events</a></p>
<p class="toc level4"><a href="gkhic.html#gkhih">Firing Events</a></p>
<p class="toc level3 tocsp"><a href="gkhjx.html">Using Interceptors</a></p>
<p class="toc level3"><a href="gkhqf.html">Using Decorators</a></p>
<p class="toc level3"><a href="gkhqc.html">Using Stereotypes</a></p>
<p class="toc level2 tocsp"><a href="gkhre.html">31.&nbsp;&nbsp;Running the Advanced Contexts and Dependency Injection Examples</a></p>
<p class="toc level1 tocsp"><a href="bnbpy.html">Part&nbsp;VI&nbsp;Persistence</a></p>
<p class="toc level2"><a href="bnbpz.html">32.&nbsp;&nbsp;Introduction to the Java Persistence API</a></p>
<p class="toc level2"><a href="gijst.html">33.&nbsp;&nbsp;Running the Persistence Examples</a></p>
<p class="toc level2"><a href="bnbtg.html">34.&nbsp;&nbsp;The Java Persistence Query Language</a></p>
<p class="toc level2"><a href="gjitv.html">35.&nbsp;&nbsp;Using the Criteria API to Create Queries</a></p>
<p class="toc level2"><a href="gkjiq.html">36.&nbsp;&nbsp;Creating and Using String-Based Criteria Queries</a></p>
<p class="toc level2"><a href="gkjjf.html">37.&nbsp;&nbsp;Controlling Concurrent Access to Entity Data with Locking</a></p>
<p class="toc level2"><a href="gkjia.html">38.&nbsp;&nbsp;Improving the Performance of Java Persistence API Applications By Setting a Second-Level Cache</a></p>
<p class="toc level1 tocsp"><a href="gijrp.html">Part&nbsp;VII&nbsp;Security</a></p>
<p class="toc level2"><a href="bnbwj.html">39.&nbsp;&nbsp;Introduction to Security in the Java EE Platform</a></p>
<p class="toc level2"><a href="bncas.html">40.&nbsp;&nbsp;Getting Started Securing Web Applications</a></p>
<p class="toc level2"><a href="bnbyk.html">41.&nbsp;&nbsp;Getting Started Securing Enterprise Applications</a></p>
<p class="toc level1 tocsp"><a href="gijue.html">Part&nbsp;VIII&nbsp;Java EE Supporting Technologies</a></p>
<p class="toc level2"><a href="gijto.html">42.&nbsp;&nbsp;Introduction to Java EE Supporting Technologies</a></p>
<p class="toc level2"><a href="bncih.html">43.&nbsp;&nbsp;Transactions</a></p>
<p class="toc level2"><a href="bncjh.html">44.&nbsp;&nbsp;Resource Connections</a></p>
<p class="toc level2"><a href="bncdq.html">45.&nbsp;&nbsp;Java Message Service Concepts</a></p>
<p class="toc level2"><a href="bncgv.html">46.&nbsp;&nbsp;Java Message Service Examples</a></p>
<p class="toc level2"><a href="gkahp.html">47.&nbsp;&nbsp;Advanced Bean Validation Concepts and Examples</a></p>
<p class="toc level2"><a href="gkeed.html">48.&nbsp;&nbsp;Using Java EE Interceptors</a></p>
<p class="toc level1 tocsp"><a href="gkgjw.html">Part&nbsp;IX&nbsp;Case Studies</a></p>
<p class="toc level2"><a href="gkaee.html">49.&nbsp;&nbsp;Duke's Tutoring Case Study Example</a></p>
<p class="toc level1 tocsp"><a href="idx-1.html">Index</a></p>
</td>
      <td width="10px">&nbsp;</td>
      <td>
         <div class="header">
             <div class="banner">
                <table width="100%" border="0" cellpadding="5" cellspacing="0">
                   <tbody>
                      <tr>
                         <td valign="bottom"><p class="Banner">The Java EE 6 Tutorial
</p></td>
                         <td align="right"  valign="bottom"><img src="graphics/javalogo.png" alt="Java Coffee Cup logo"></td>
                      </tr>
                   </tbody>
                </table>
             </div>

             <div class="header-links">
	         <a href="./index.html">Home</a> | 
<a href="../information/download.html">Download</a> | 
<a href="./javaeetutorial6.pdf">PDF</a> | 
<a href="../information/faq.html">FAQ</a> | 
<a href="http://download.oracle.com/javaee/feedback.htm">Feedback</a>

             </div>
             <div class="navigation">
                 <a href="gjehi.html"><img src="graphics/leftButton.gif" border="0" alt="Previous" title="Previous"></a>
                 <a href="p1.html"><img src="graphics/upButton.gif" border="0" alt="Contents" title="Contents"></a>
                 <a href="gkgkv.html"><img src="graphics/rightButton.gif" border="0" alt="Next" title="Next"></a>
             </div>
         </div>

	 <div class="maincontent">      	 
             

<a name="gjsdf"></a><h2>Using Alternatives</h2>
<a name="indexterm-1560"></a><a name="indexterm-1561"></a><a name="indexterm-1562"></a><p>When you have more than one version of a bean that you
use for different purposes, you can choose between them during the development phase
by injecting one qualifier or another, as shown in <a href="gjbju.html">The <tt>simplegreeting</tt> CDI Example</a>.</p>

<p>Instead of having to change the source code of your application, however, you
can make the choice at deployment time by using alternatives.</p>

<p>Alternatives are commonly used for purposes like the following:</p>


<ul><li><p>To handle client-specific business logic that is determined at runtime</p>

</li>
<li><p>To specify beans that are valid for a particular deployment scenario (for example, when country-specific sales tax laws require country-specific sales tax business logic)</p>

</li>
<li><p>To create dummy (mock) versions of beans to be used for testing</p>

</li></ul>
<p>To make a bean available for lookup, injection, or EL resolution using this
mechanism, give it a <tt>javax.enterprise.inject.Alternative</tt> annotation and then use the <tt>alternative</tt> element to
specify it in the <tt>beans.xml</tt> file.</p>

<p>For example, you might want to create a full version of a
bean and also a simpler version that you use only for certain kinds
of testing. The example described in <a href="gkhpu.html">The <tt>encoder</tt> Example: Using Alternatives</a> contains two such beans, <tt>CoderImpl</tt> and <tt>TestCoderImpl</tt>. The
test bean is annotated as follows:</p>

<pre>@Alternative
public class TestCoderImpl implements Coder { ... }</pre><p>The full version is not annotated:</p>

<pre>public class CoderImpl implements Coder { ... }</pre><p>The managed bean injects an instance of the <tt>Coder</tt> interface:</p>

<pre>@Inject
Coder coder;</pre><p>The alternative version of the bean is used by the application only if
that version is declared as follows in the <tt>beans.xml</tt> file:</p>

<pre>&lt;beans ... >
    &lt;alternatives>
        &lt;class>encoder.TestCoderImpl&lt;/class>
    &lt;/alternatives>
&lt;/beans></pre><p>If the <tt>alternatives</tt> element is commented out in the <tt>beans.xml</tt> file, the
<tt>CoderImpl</tt> class is used.</p>

<p>You can also have several beans that implement the same interface and are
all annotated <tt>@Alternative</tt>. In this case, you must specify in the <tt>beans.xml</tt> file
which of these alternative beans you want to use. If <tt>CoderImpl</tt> were also
annotated <tt>@Alternative</tt>, one of the two beans would always have to be
specified in the <tt>beans.xml</tt> file.</p>



<a name="gkhpo"></a><h3>Using Specialization</h3>
<a name="indexterm-1563"></a><a name="indexterm-1564"></a><p>Specialization has a function similar to that of alternatives, in that it allows
you to substitute one bean for another. However, you might want to make
one bean override the other in all cases. Suppose that you defined the
following two beans:</p>

<pre>@Default @Asynchronous
public class AsynchronousService implements Service { ... }</pre><pre>@Alternative
public class MockAsynchronousService extends AsynchronousService { ... }</pre><p>If you then declared <tt>MockAsynchronousService</tt> as an alternative in your <tt>beans.xml</tt> file, the
following injection point would resolve to <tt>MockAsynchronousService</tt>:</p>

<pre>@Inject Service service;</pre><p>The following, however, would resolve to <tt>AsynchronousService</tt> rather than <tt>MockAsynchronousService</tt>, because <tt>MockAsynchronousService</tt> does
not have the <tt>@Asynchronous</tt> qualifier:</p>

<pre>@Inject @Asynchronous Service service;</pre><p>To make sure that <tt>MockAsynchronousService</tt> is always injected, you would have to implement
all bean types  and bean qualifiers of <tt>AsynchronousService</tt>. However, if <tt>AsynchronousService</tt> declared
a producer method or observer method, even this cumbersome mechanism would not ensure
that the other bean is never invoked. Specialization provides a simpler mechanism.</p>

<p>Specialization happens at development time as well as at runtime. If you declare
that one bean <b>specializes</b> another, it extends the other bean class, and at
runtime the specialized bean completely replaces the other bean. If the first bean
is produced by means of a producer method, you must also override the
producer method.</p>

<p>You specialize a bean by giving it the <tt>javax.enterprise.inject.Specializes</tt> annotation. For example,
you might declare a bean as follows:</p>

<pre>@Specializes
public class MockAsynchronousService extends AsynchronousService { ... }</pre><p>In this case, the <tt>MockAsynchronousService</tt> class will always be invoked instead of the
<tt>AsynchronousService</tt> class.</p>

<p>Usually, a bean marked with the <tt>@Specializes</tt> annotation is also an alternative and
is declared as an alternative in the <tt>beans.xml</tt> file. Such a bean
is meant to stand in as a  replacement for the default implementation,
and the alternative implementation automatically inherits all qualifiers of the default implementation as
well as its EL name, if it has one.</p>


         </div>
         <div class="navigation">
             <a href="gjehi.html"><img src="graphics/leftButton.gif" border="0" alt="Previous" title="Previous"></a>
             <a href="p1.html"><img src="graphics/upButton.gif" border="0" alt="Contents" title="Contents"></a>
             <a href="gkgkv.html"><img src="graphics/rightButton.gif" border="0" alt="Next" title="Next"></a>
         </div>

         <div class="copyright">
      	    <p>Copyright &copy; 2011, Oracle and/or its affiliates. All rights reserved. <a href="docinfo.html">Legal Notices</a></p>
      	 </div>

      </td>
   </tr>
</tbody>
</table>
</body>
</html>

